package testes;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import Exceptions.ItenJaCadastradoException;

import classes.Endereco;
import classes.Iten;
import classes.Usuario;
import classes.Categoria;

public class UsuarioTest {
	private Endereco e1, e2;
	private Usuario u1,u2,u3;
	private Iten i1,i2;
	private Categoria categoria;
	
	@Before
	public void setUp() throws Exception{
		e1 = new Endereco("Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		e2 = new Endereco("Novo rua teste", "456", "Novo bairro teste", "Nova cidade teste", "Novo estado teste", "Novo complemento teste");
		u1 = new Usuario("Usuario teste","Login teste",e1);
		u2 = new Usuario("Usuario teste2","Login teste2",e2);
		u3 = new Usuario("Usuario teste3","Login teste3",e2);
		i1 = new Iten("Nome teste", "Descricao teste", categoria.FILME);
		i2 = new Iten("Nome teste", "Descricao teste", categoria.FILME);
	}
	
	@Test
	public void testConstrutor() throws Exception{
		System.out.println(u1.toString());
		try{
			u1 = new Usuario(null,"Login teste",e1);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
		
		try{
			u1 = new Usuario("","Login teste",e1);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
		
		try{
			u1 = new Usuario("Usuario teste",null,e1);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
		
		try{
			u1 = new Usuario("Usuario teste","",e1);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
	}
	
	@Test
	public void testGetNome(){
		Assert.assertEquals("Erro no getNome","Usuario teste", u1.getNome());
	}
	
	@Test
	public void testSetNome(){
		try {
			u1.setNome(null);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
		
		try {
			u1.setNome("");
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
	}
	
	@Test
	public void testGetLogin(){
		Assert.assertEquals("Erro no getLogin","Login teste", u1.getLogin());
	}
	
	@Test
	public void testSetLogin(){
		try {
			u1.setLogin(null);
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
		
		try {
			u1.setLogin("");
			Assert.fail("Todos os dados sao necessarios!");
		}catch (Exception ex){
			Assert.assertEquals("Exception nao esperada","Todos os dados sao necessarios!", ex.getMessage());
		}
	}
	
	@Test
	public void testGetEndereco(){
		Assert.assertEquals("Erro no getEndereco",e1, u1.getEndereco());
	}
	
	@Test
	public void testSetEndereco(){
		Assert.assertEquals("Erro no getEndereco",e1, u1.getEndereco());
		u1.setEndereco(e2);
		Assert.assertEquals("Erro no getEndereco",e2, u1.getEndereco());
	}
	
	@Test
	public void testCadastraIten() throws ItenJaCadastradoException{
		u1.cadastraItens(i1);
		try {
			u1.cadastraItens(i2);
			Assert.fail("Iten ja cadastrado.");
		}catch (ItenJaCadastradoException ex){
			Assert.assertEquals("Exception nao esperada","Iten ja cadastrado.",ex.getMessage());
		}
	}
	
	@Test
	public void getListPedidosRecebidos(){
		Assert.assertEquals("getListaPedidosRecebidos com erro",0,u1.getListPedidosRecebidos().size());
		u2.requisitarAmizade(u2,u1,"");
		Assert.assertEquals("Pedido nao foi feito",1,u1.getListPedidosRecebidos().size());
		u1.aceitarAmizade(u2,u1);
		Assert.assertEquals("Pedido nao foi retirado",0,u1.getListPedidosRecebidos().size());
	}
	
	@Test
	public void pedidoDeAmizade(){
		u1.requisitarAmizade(u1,u2, "");
		Assert.assertEquals("Pedido nao recebido.",1,u2.getListPedidosRecebidos().size());
		u1.requisitarAmizade(u1,u3, "");
		Assert.assertEquals("Pedido nao recebido.",1,u3.getListPedidosRecebidos().size());
		u3.requisitarAmizade(u3,u2, "");
		Assert.assertEquals("Pedido nao recebido.",2,u2.getListPedidosRecebidos().size());
		u2.aceitarAmizade(u3,u2);
		Assert.assertEquals("U3 nao foi adicionado a lista de amigos.",1,u2.getListAmigos().size());
		Assert.assertEquals("U2 nao foi adicionado a lista de amigos.",1,u3.getListAmigos().size());
		Assert.assertEquals("Lista de amigos com erro.",0,u1.getListAmigos().size());
		Assert.assertEquals("Pedido aceito nao foi retirado da lista de pedidos recebidos",1,u2.getListPedidosRecebidos().size());
		u3.aceitarAmizade(u1,u3);
		Assert.assertEquals(2,u3.getListAmigos().size());
		Assert.assertEquals(0,u3.getListPedidosRecebidos().size());
		u3.requisitarAmizade(u3, u1, "");
		Assert.assertEquals(1,u1.getListPedidosRecebidos().size());
		u1.rejeitarAmizade(u3);
		Assert.assertEquals(0,u1.getListPedidosRecebidos().size());
	}
}
